package com.hexu.event.view;

import com.hexu.event.service.RegisterService;
import com.hexu.event.util.StageUtil;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import com.hexu.event.entity.User;

import java.util.Arrays;
import java.util.List;

import static com.hexu.event.util.ServiceUtil.*;

public class RegisterView{
    //设置标签
    Label labelPhoneNumber = new Label("账号");
    Label labelPassword = new Label("密码");
    Label labelUserName = new Label("用户名");
    Label labelSex = new Label("性别");

    //创建空的TextField对象
    TextField phoneNumber = new TextField();
    TextField password = new TextField();
    TextField userName = new TextField();
    //存性别的选择
    final String[] desc = new String[1];

    public void registerView(Stage primaryStage)throws Exception{
        phoneNumber.clear();
        password.clear();
        userName.clear();
        Tooltip tooltip = new Tooltip("请输入11位手机号码!");
        phoneNumber.setTooltip(tooltip);
        phoneNumber.setPromptText("请输入11位手机号码");
        phoneNumber.setFocusTraversable(false);

        //设置字体大小
        labelPhoneNumber.setFont(Font.font(14));
        labelPassword.setFont(Font.font(14));
        labelUserName.setFont(Font.font(14));
        labelSex.setFont(Font.font(14));

        //设置按钮
        Button register = new Button("注册");
        Button Return = new Button("返回登录界面");
        Button visitorsLogin = new Button("游客登录");

        //创建网格布局
        GridPane gridPane = new GridPane();
        //设置颜色
        gridPane.setStyle("-fx-background-color: #FFF5EE");

        // 初始化性别列表
        List<String> snackList = Arrays.asList("男", "女", "未知性别");
        // 把清单对象转换为JavaFX控件能够识别的数据对象
        ObservableList<String> obList = FXCollections.observableArrayList(snackList);
        // 依据指定数据创建下拉框
        ComboBox<String> comboBox = new ComboBox<String>(obList);
        // 设置下拉框默认选中第1项
        comboBox.getSelectionModel().select(0);
        // 设置下拉框能否编辑。默认不允许编辑
        comboBox.setEditable(false);
        //开始默认获取性别为男
        desc[0] = "男";
        // 设置下拉框的选择监听器
        comboBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> arg0, String old_str, String new_str) {
                // getSelectedIndex方法可获得选中项的序号，getSelectedItem方法可获得选中项的对象
                desc[0] = comboBox.getSelectionModel().getSelectedItem();
            }
        });

        //设置网格位置
        gridPane.add(labelPhoneNumber,0,1);
        gridPane.add(phoneNumber,1,1);
        gridPane.add(labelPassword,0,2);
        gridPane.add(password,1,2);
        gridPane.add(labelUserName,0,3);
        gridPane.add(userName,1,3);
        gridPane.add(labelSex,0,4);
        gridPane.add(comboBox,1,4);
        gridPane.add(register,0,5);
        gridPane.add(visitorsLogin,1,5);
        gridPane.add(Return,2,5);

        //设置水平间距
        gridPane.setHgap(5);
        //设置垂直间距
        gridPane.setVgap(15);

        //进行中间对齐
        gridPane.setAlignment(Pos.CENTER);


        StageUtil.showStage(primaryStage,new Scene(gridPane),500,500,"注册",false);

        //设置游客登录单击事件
        visitorsLogin.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                primaryStage.close();
                try {
                    visitorsView.visitorsView(primaryStage);
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        });

        //设置单击事件 新用户注册
        register.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {

                //信息填满而且手机号正确
                if(errorHandling()) {

                    //把输入的数据穿给user
                    User user = new User(null,phoneNumber.getText(),password.getText(),userName.getText(),0,desc[0],null,null,null);

                    //判断手机号有没有重复
                    if((new RegisterService()).existPhoneNumber(phoneNumber.getText())) {
                        //判断注册数据是否成功
                        addSuccess(primaryStage,user);

                    }
                    //手机号已经存在
                    else {
                        Alert alert = new Alert(Alert.AlertType.INFORMATION);
                        alert.setTitle("消息");
                        alert.setHeaderText("注册失败,手机号已经存在！");
                        alert.showAndWait();
                    }

                }
            }
        });

        //设置单击事件 返回登录界面
        Return.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                primaryStage.close();
                try {
                    loginInView.start(primaryStage);
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        });

        //超过11位手机号码就不能输入
        phoneNumber.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                if(newValue.length() > 11){
                    phoneNumber.setText(oldValue);
                }
            }
        });

        //限制输入的手机号只能是数字
        StageUtil.limit(phoneNumber);

    }

    //判断信息是否填完全、手机号码是否正确
    private boolean errorHandling(){

        if(phoneNumber.getLength() != 11){
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("消息");
            alert.setHeaderText("注册失败,请输入正确的手机号码!");
            alert.showAndWait();

            return false;
        }
        //如果信息有空处未填
        else if(password.getText().equals("") || userName.getText().equals("")){
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("消息");
            alert.setHeaderText("注册失败,信息未完善!");
            alert.showAndWait();
            return false;
        }
        return true;
    }

    //判断是否注册成功
    private boolean addSuccess(Stage primaryStage,User user){
        //判断添加注册的数据是否成功
        Boolean in = (new RegisterService()).addUser(user);

        //调用工具类的方法判断是否注册成功
        StageUtil.display(in,primaryStage,"注册");
        if(in){
            //弹出用户的窗口
            userView.getUserInformation( phoneNumber.getText());
            try {
                userView.userView(primaryStage);
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
        return in;
    }
}
